Migrate Dashy to Vue 3, Vite and Node 24#2002
Merged
Conversation
This comment was marked as outdated.
This comment was marked as outdated.
✅ Deploy Preview for dashy-dev ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as duplicate.
This comment was marked as duplicate.
This was referenced Mar 9, 2026
Repository owner
deleted a comment from
liss-bot
Mar 11, 2026
transition class names (-enter → -enter-from), ::v-deep → :deep(), $router.currentRoute → $route, removed duplicate proxyReqEndpoint overrides that shadow the mixin Plus some error handling and robustness improvments to global error handler, try-catch on all JSON.parse/yaml.load from localStorage/config, null-checks on DOM lookups, .catch() on unhandled axios promises, sanitized v-html in Footer And removes stake weback and vue cli cleanup of crap.
This was referenced Apr 26, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Highlights
/<view>/<page>/<section>URLs across views/configs/sections, with proper deep-linking and auth controlsBreaking Changes
Old env vars won't work client-side
Since the rebuild requirement was removed, this means that the frontend no longer has access to any env vars. Everything which could be, has been ported to the server. But the following env vars will now no longer be read. If you want to keep using them, you'll need to build Dashy from source yourself instead.
VITE_APP_ROUTING_MODE- Sets eitherhashvshistoryrouting. Defaults tohistory.VITE_APP_CONFIG_PATH- The location of the main config file. Defaults toconf.ymlVITE_APP_DOMAIN- The domain/URI where Dashy is hosted. Fallsback towindow.location.originBASE_URL- The path to serve Dashy from. Defaults to/VITE_APP_BASIC_AUTH_USERNAME/_PASSWORD- To auto-fill the basic auth formVITE_APP_VERSION- Override current version num of Dashy running, injected at build-time (by us)Docker Changes
user: "1000:1000"with your own ids in your docker-compose. Existing volumes owned byrootwill fail.node /app/services/healthchecktonode /app/services/healthcheck.js(note it now has the.jsextension). So if your compose files or Kubernetes probes were hard-coding this, they'll need updating.Config Changes
pageInfo.footerTextrenamed topageInfo.footerfooternot set, footer won't be shown (no more default footer). So we removed the oldappConfig.hideComponents.hideFooteroption.section.displayData.rowsis deprecated, because we now calculate rows dynamically based on available screen sizesection.displayData.colsstill works, but will be clamped to the page width (to prevent broken layouts on mobile).appConfig.enableServiceWorker: trueto enable and setup.additionalProperties: falsethroughout, so you might see new warnings if you previously had some unknown/invalid attributes floating aroundIssues Resolved
Main Changes Made
Vue 3 migration
createStore()APIcreateRouter()+ history factorieslegacy: falseComposition API modeVue.use()registrations withapp.use()plugin patternnew Vue()forcreateApp()inmain.js@vue/compat, app is now pure Vue 3 with no compat shimsbeforeDestroy→beforeUnmount,destroyed→unmountedslot=""syntax replaced withv-sloteverywhere<template v-for>now uses:keyon the template (Vue 3 requirement){{ value | filter }}) are gone, replaced with plain methods/computedsv-modelupdated to use the new modelValue/update:modelValue contract<transition>class names:slide-enter→slide-enter-from::v-deepwith:deep()selector everywhereemitsarrays to every component declaring custom eventsapp.config.errorHandlerBuild system overhaul
vite.config.mjswith PWA, SVG loader, and user-data dev pluginvitest.config.js→vitest.config.mjs, upgraded vitest 1.6 → 4NODE_OPTIONS=--openssl-legacy-providerfully eliminated, no more crufty flagsprocess.env.VUE_APP_*→import.meta.env.VITE_APP_*everywheredefaults.jsconverted from CommonJS to ESM named exportsuser-data/YAML during devurl('./assets/fonts/')→url('@/assets/fonts/')index.htmlmoved to repo root as the proper Vite entry pointDependencies
vue-js-modal, built our own lightweight Teleport-based modalv-tooltip, wrote our own zero-dependencyv-tooltipdirectivevue-toasted, built our own toast pluginvue-material-tabs, wrote our ownTabs/TabItemcomponentsvue-json-tree-view, replaced with prettier YAML previewvue3-json-viewer, no longer needed@formschema/native, replaced with@jsonforms/vuev-jsoneditorand the broken JSON-tree experience that came with itrss-parser, wrote a tiny native DOMParser-based one (~80 lines)register-service-worker, doing it manually nowconnect-history-api-fallback, no longer needed with Vite@sentry/tracing, kept the Vue Sentry SDK (now lazy-loaded)remedialandentities(transitive cleanup)axios, replaced with custom client + server request wrappers@jsonforms/vueand@jsonforms/vue-vanillafor schema-driven formsajv-formatsfor stricter schema validationyaml(eemeli/yaml) for proper YAML AST worksupertestfor the new server endpoint testssimple-icons14 → 16happy-dom17 → 20 (security)resolutionsblock in package.json, only what's still neededPerformance
simple-icons, the heaviest dep, only when an SI icon is renderedEditModeSaveMenuandAddNewSectionuntil edit mode is enteredloading="lazy"added to all item icon<img>tagsSettings menu
Themes
color-themes.scssinto per-theme filesLayouts
Sections
Multi-page / sub-page configs
/<view>/<page>/<section>URLsPage meta
pageInfo.faviconconfig to set a custom faviconpageInfo.colorconfig to set the browser address bar / theme colourlangattribute kept in sync with active languageHeader and Footer
pageInfo.footerrouter-linkfor internal paths, andrel="noopener noreferrer"for externalConfig
appConfig/pageInfo/pages@jsonforms/vuewith vanilla renderers and Dashy stylingpruneSchemaDefaultsstrips defaults + empties before save, keeps user YAML minimalDebug menu
Auth
Server
server.jsintoservices/app.jsLinting
// eslint-disable-linecomment, fixed underlying issuesvue-tsc --noEmit, newlintandtypecheckscriptsSchema-driven config
ConfigSchema.jsonwith proper JSON-Schema title / description / examplesadditionalProperties: falseeverywhere, so typos in YAML get flaggedsubItems,displayData,statusCheck*all properly modelledStorage / store
configSourcetracks the as-loaded YAML, separate from the runtime viewappConfig-<pageId>,theme-<pageId>, etc)clearScopedLocalConfigproperly tidies up across all pagesstripRootOwnedFieldsensuresauthandpagesalways live on root onlysafeCloneutil tolerates Vue's reactive proxiesRouting
/<view>/<page>/<section>URLs across home, minimal, workspacersup-progress) hooked into all transitionslanding-page-*route swapped for a singlelandingredirectorstartingViewconfig now resolved at runtime from appConfigWorkspace view
hideFromWorkspaceon both pages and sectionsMinimal view
/minimal/:page/:section)PWA
vite-plugin-pwafor service worker generation/index.htmlfor SPA routesDocs
Dockerfile / containers